import color.impl.Blue;
import color.impl.Red;
import shape.Shape;
import shape.impl.Circle;
import shape.impl.Rectangle;

/**
 * 桥接模式利用了多态性，将抽象部分与实现部分分离，使得它们可以独立变化。这里的"某个属性"通常是一个接口或抽象类，它代表了实现部分，而对象的其他属性和行为则属于抽象部分。通过这种方式，桥接模式能够动态地将不同的抽象部分和实现部分组合在一起，实现灵活的扩展。
 * 例如，在前面的咖啡店例子中，"咖啡口味"（如拿铁、摩卡）是抽象部分，"杯型"（如小杯、大杯）是实现部分。顾客可以动态选择任意口味的咖啡和任意杯型，这就是通过多态性将杯型属性动态化，使得咖啡的组合变得更加多样。
 * 在软件设计中，桥接模式使得我们可以独立地增加新的口味（抽象部分的扩展）或新的杯型（实现部分的扩展），而不需要修改现有的咖啡类或杯型类，这正是面向对象设计中“开闭原则”的体现——对扩展开放，对修改关闭。
 */
public class Main {
    public static void main(String[] args) {
        Shape blueCircle = new Circle(new Blue());
        Shape redCircle = new Circle(new Red());
        blueCircle.draw();
        redCircle.draw();
        Shape blueRectangle = new Rectangle(new Blue());
        Shape redRectangle = new Rectangle(new Red());
        blueRectangle.draw();
        redRectangle.draw();
    }
}